/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package xmlaufgabe8;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.text.BadLocationException;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 * Klasse zum Parsen und Ausgeben der SimpleTextFormat XML Datei.
 * 
 * @author s0527676
 */
public class SimpleTextParser extends DefaultHandler {
    /**
     * Speichert Ortszustand innerhalb des zu parsenden XML Dokuments
     */
    private boolean inHeader;
    
    /**
     * Speichert Ortszustand innerhalb des zu parsenden XML Dokuments
     */
    private boolean inParagraph;
    
    /**
     * Speichert Ortszustand innerhalb des zu parsenden XML Dokuments
     */
    private boolean inNumberedList;
    
    /**
     * Speichert Ortszustand innerhalb des zu parsenden XML Dokuments
     */
    private boolean inListItem;
    
    /**
     * Speichert das Anzeigeelement
     */
    private TextDisplay display;
    
    /**
     * Speichert systemunabhaengigen Zeilenumbruch
     */
    private String newLine = System.getProperty("line.separator");
    
    /**
     * Speichert die aktuelle Nummerierung innerhalb einer Liste
     */
    private int number;
    
    /**
     * Standard Konstruktor, initialisiert Felder.
     * 
     * @param display Uebergebenes Anzeigeelement
     */
    public SimpleTextParser(TextDisplay display) {
        inHeader = false;
        inParagraph = false;
        inNumberedList = false;
        inListItem = false;
        this.display = display;
        number = 1;
    }
    
    /**
     * Parst in der aktuellen Zeile im XML Dokument nach Starttags und setzt
     * Stati der Ortszustaende.
     * 
     * @param nameSpace Namespace des Tag-Elements
     * @param elementName Elementname des Tag-Elements
     * @param qualifiedName Qualifizierter Name des Tag-Elements
     * @param attribute Attributliste des Tag-Elements
     * @throws SAXException 
     */
    @Override
    public void startElement(String nameSpace, String elementName, String qualifiedName, Attributes attribute) throws SAXException {
        if(elementName.equals("Ueberschrift")) {
            inHeader = true;
        }
        
        if(elementName.equals("Absatz")) {
            inParagraph = true;
        }
        
        if(elementName.equals("Aufzaehlung")) {
            if(attribute.getValue("nummeriert").equals("true")) {
                inNumberedList = true;
            }
        }
        
        if(elementName.equals("Item")) {
            inListItem = true;
        }
        //System.out.println(elementName);
    }
    
    /**
     * Parst in der aktuellen Zeile im XML Dokument nach Endtags und setzt
     * Stati der Ortszustaende.
     * 
     * @param nameSpace Namespace des Tag-Elements
     * @param elementName Elementname des Tag-Elements
     * @param qualifiedName Qualifizierter Name des Tag-Elements
     * @throws SAXException 
     */
    @Override
    public void endElement(String nameSpace, String elementName, String qualifiedName) throws SAXException {
        if(elementName.equals("Ueberschrift")) {
            inHeader = false;
        }
        
        if(elementName.equals("Absatz")) {
            inParagraph = false;
        }
        
        if(elementName.equals("Aufzaehlung")) {
            if(inNumberedList) {
                inNumberedList = false;
                number = 1;
            }
        }
        
        if(elementName.equals("Item")) {
            inListItem = false;
        }
        //System.out.println(elementName);
    }
    
    /**
     * Parst in der aktuellen Zeile im XML Dokument den Text zwischen Start-
     * und Endtags und gibt relevante Informationen an das Anzeigeelement display
     * zur Ausgabe auf dem Bildschirm.
     * 
     * @param text Text zwischen Start- und Endtags
     * @param start Startposition des wichtigen Textteils
     * @param length Laenge des Textes
     * @throws SAXException 
     */
    @Override
    public void characters(char[] text, int start, int length) throws SAXException {
        if(inHeader) {
            String label = "";
            
            for(int i = 0; i < length; i++) {
                label = label.concat(Character.toString(text[start+i]));
            }
            
            label = label.concat(newLine);
            
            try {
                display.addHeader(label);
            } catch (BadLocationException ex) {
                Logger.getLogger(SimpleTextParser.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        
        if(inParagraph) {
            String label = "";
            
            for(int i = 0; i < length; i++) {
                label = label.concat(Character.toString(text[start+i]));
            }
            
            label = label.concat(newLine);
            
            try {
                display.addParagraph(label);
            } catch (BadLocationException ex) {
                Logger.getLogger(SimpleTextParser.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        
        if(inListItem) {
            String label = "";
            
            for(int i = 0; i < length; i++) {
                label = label.concat(Character.toString(text[start+i]));
            }
            
            String editedLabel = "";
            
            if(inNumberedList) {
                editedLabel = editedLabel.concat(Integer.toString(number) + ".      ");
                number++;
            } else {
                editedLabel = editedLabel.concat("* ");
            }
            
            editedLabel = editedLabel.concat(label + newLine);
            try {
                display.addItem(editedLabel);
            } catch (BadLocationException ex) {
                Logger.getLogger(SimpleTextParser.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}
